/**  
 * 文 件 名: Util.java  
 * 描    述：   
 * 版    权：Copyright (c)20012-2012 tongzhou All Rights Reserved.
 * 公    司: 同舟 
 * 作    者：彭定雄                     
 * 版    本: 1.0  
 * 创建时间: 2012-10-27
 *  
 * 修改历史：  
 * 时间                             作者                       版本                        描述  
 * ------------------------------------------------------------------  
 * 2012-10-27        彭定雄                1.0          1.0 Version  
 */         

package com.tongzhou.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;

import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.opensymphony.xwork2.ActionContext;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import com.tongzhou.common.Constants;
import com.tongzhou.db.DBUtil;
import com.tongzhou.db.exception.DBException;
import com.tongzhou.system.rightsMgmt.dao.IRightDAO;
import com.tongzhou.system.rightsMgmt.dao.impl.RightDAO;

public class Util {
	
	private static Logger log = Logger.getLogger(Util.class.getName());
	
	//移动号码前缀
	public static List<String> cmcs = null ;
	//联通号码前缀
	public static List<String> cncs = null ;
	//电信号码前缀
	public static List<String> ctcs = null ;
	
	/** 产生字符序列号时用到的计数器**/
	private static int stringCount = 1000; 
	
	/**
	 * 数组转化为List列表
	 *@author: 彭定雄
	 *@param arr
	 *@return
	 */
	public static List<String> arrayToStringList(String[]arr){
		List<String> list = new ArrayList<String> () ;
		if(arr==null||arr.length<=0){
			return list ;
		}else{
			for(String str:arr){
				list.add(str) ;
			}
		}
		return list ;
	}
	/**
	 * 数组转化为字符串
	 *@author: 彭定雄
	 *@param arr
	 *@return
	 */
	public static String arrayToString(String [] arr){
		if(arr==null) return "" ;
		
		String result = "" ;
		
		for(String str:arr){
			result += str+"," ;
		}
		
		if(result.length()>0){
			result = result.substring(0, result.lastIndexOf(",")) ;
		}
		
		return result ;
	}
	/**
	 * 根据页号和页大小计算上一页最后一条记录的序号
	 *@author: 彭定雄
	 *@param currentPage
	 *@param pageSize
	 *@return
	 */
	public static int getStartPos(int currentPage,int pageSize){
		if(currentPage<=0) currentPage = 1 ;
		if(pageSize<=0) pageSize = 1 ;
		return (currentPage-1)*pageSize ;
	}
	
	/**
	 * 根据总记录数和页面大小计算总页数
	 *@author: 彭定雄
	 *@param total
	 *@param pageSize
	 *@return
	 */
	public static long getTotalPage(long total,int pageSize){
		if(total<0) total = 0 ;
		if(pageSize<=0) pageSize = 1 ;
		
		long totalPage = 1 ;
		if(total%pageSize==0){
			totalPage = total/pageSize;
		}else{
			totalPage = total/pageSize+1 ;
		}
		return totalPage ;
	}
	
	/**
	 * 生成问号串,用于写SQL代码时使用
	 *@author: 彭定雄
	 *@param num 问号个数
	 *@return
	 */
	public static String generateNotationString(int num)
	{
		StringBuffer result = new StringBuffer() ;
		
		for(int i=0;i<num;i++)
		{
			result.append("?").append(",") ;
		}
		
		if(result.length()>=2)
		{
			result.deleteCharAt(result.length()-1) ;
		}
		
		return result.toString() ;
	}
	
	/**
	 * 判断是否为数字
	 *@author: 彭定雄
	 *@param str
	 *@return
	 */
	public static boolean isNumeric(String str){ 
	    Pattern pattern = Pattern.compile("[0-9]*"); 
	    return pattern.matcher(str).matches();    
	 } 
	
	/**
	 * 字符串转为时间
	 *@author: 彭定雄
	 *@param str
	 *@return
	 */
	public static Date getDateFromStr(String str){
		Date date = null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			date = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date ;
	}
	
	/**
	 * 取得年份
	 *@author: 彭定雄
	 *@param date
	 *@return
	 */
	public static String getYear(Date date){
		String str = null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		str = sdf.format(date);
		return str ;
	}
	
	/**
	 * 取得月份
	 *@author: 彭定雄
	 *@param date
	 *@return
	 */
	public static String getMonth(Date date){
		String str = null;
		SimpleDateFormat sdf = new SimpleDateFormat("MM");
		str = sdf.format(date);
		return str ;
	}
	
	/**
	 * 得到日期的字符串
	 *@author: 彭定雄
	 *@param date
	 *@return
	 */
	public static String getDateStr(Date date){
		String str = null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		str = sdf.format(date);
		return str ;
	}
	
	/**
	 * 根据号码前缀取得号码所属运营商 
	 *@author: 彭定雄
	 *@param mobile
	 *@return
	 */
	public static int getOperator(String mobile){
		
		if(cmcs==null||cncs==null||ctcs==null){
			loadOperatorCfg();
		}
		
		//判断
		if(mobile!=null&&mobile.length()==11){
			String str = mobile.substring(0,3);
			if(cmcs.contains(str)){//移动
				return Constants.OPERATOR_CMC ;
			}else if(cncs.contains(str)){//联通
				return Constants.OPERATOR_CNC ;
			}else if(ctcs.contains(str)){//电信
				return Constants.OPERATOR_CTC ;
			}else{//未知
				return Constants.OPERATOR_UNKNOW ;
			}
		}else{
			return Constants.OPERATOR_UNKNOW ;
		}
	}
	
	/**
	 * 加载运营商配置文 件
	 *@author: 彭定雄
	 */
	private static void loadOperatorCfg(){
		
		if(cmcs!=null){
			cmcs.clear();
		}else{
			cmcs = new ArrayList<String>() ;
		}
		
		if(cncs != null){
			cncs.clear() ;
		}else{
			cncs = new ArrayList<String>() ;
		}
		
		if(ctcs!=null){
			ctcs.clear() ;
		}else{
			ctcs = new ArrayList<String>() ;
		}
		
		SAXReader reader = new SAXReader();
		Document doc;
		try {
			doc = reader.read(Util.class.getResourceAsStream("/operator.xml"));
			Element root = doc.getRootElement();
			Element mobilePrefix = root.element("mobilePrefix") ;
			Element cmc = mobilePrefix.element("cmc") ;
			Element cnc = mobilePrefix.element("cnc") ;
			Element ctc = mobilePrefix.element("ctc") ;
			
			//cmc
			for(Iterator i = cmc.elementIterator(); i.hasNext();){
				Element item = (Element)i.next() ;
				cmcs.add(item.getText()) ;
			}
			
			//cnc
			for(Iterator i = cnc.elementIterator(); i.hasNext();){
				Element item = (Element)i.next() ;
				cncs.add(item.getText()) ;
			}
			
			//ctc
			for(Iterator i = ctc.elementIterator(); i.hasNext();){
				Element item = (Element)i.next() ;
				ctcs.add(item.getText()) ;
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 从SESSION中得到当前管理员的ID
	 * @return
	 */
	public static int getAdminUserId(){
		ActionContext context = ActionContext.getContext()	;
		Map session = context.getSession() ;
		Integer id = Integer.valueOf((String) session.get("id"));
		if(id!=null){
			return id ;
		}else{
			return 0 ;
		}
	}
	
	/**
	 * 从SESSION中得到当前管理员的权限
	 * @return
	 */
	public static List<String> getAdminUserRights(){
		ActionContext context = ActionContext.getContext()	;
		Map session = context.getSession() ;
		List<String> rights = (List<String>)session.get("rights");
		
		if(rights!=null){
			return rights ;
		}else{
			return null ;
		}
	}
	
	/**
	 * 从SESSION中得到当前管理员的角色
	 * @return
	 */
	public static List<String> getAdminUserRoles(){
		ActionContext context = ActionContext.getContext()	;
		Map session = context.getSession() ;
		List<String> roles =(List<String>)session.get("roles");
		
		if(roles!=null){
			return roles ;
		}else{
			return null ;
		}
	}
	/**
	 * 判断字符串是否为null或则空
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static Boolean checkObjIsNull(String obj){
		if(obj==null || obj.equals("")){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 如果字符串为空或则null就返回"",否则返回字符串本身
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static String changeToObj(String obj){
		if(obj==null || obj.equals("")){
			return "";
		}else{
			return obj;
		}
	}
	
	/**
	 * 查询列表加入权限控制，userID-用户id；dataMap保存的是本SQL数据ID及其对于的表名;sql查询SQL
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static <T> T addAccessControl(String userID,Map<String,String> dataMap,
			String sql,Object[] params,ResultSetHandler<T> rsh){
		
		IRightDAO dao=new RightDAO();
		
		try {
			List<String> roles=Util.getAdminUserRoles();
			Boolean temp=roles.contains("1");
			if(temp){
				return DBUtil.query(sql,rsh,params);
			}else{
				return dao.addAccessControl(userID,dataMap,sql,params,rsh);
			}
		} catch (DBException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 查询列表加入权限控制，userID-用户id；dataMap保存的是本SQL数据ID及其对于的表名;sql查询SQL
	 * startPos开始位置；count查询个数
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static <T> T addAccessControl(String userID,Map<String,String> dataMap,
			String sql,Object[] params,ResultSetHandler<T> rsh,int startPos,int count){
		IRightDAO dao=new RightDAO();
		try {
			List<String> roles=Util.getAdminUserRoles();
			Boolean temp=roles.contains("1");
			if(temp){
				return DBUtil.query(sql,rsh,params,startPos,count);
			}else{
				return dao.addAccessControl(userID,dataMap,sql,params,rsh,startPos,count);
			}
		} catch (DBException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	* 查询列表加入权限控制，userID-用户id；dataMap保存的是本SQL数据ID及其对于的表名;sql查询SQL
	 * startPos开始位置；count查询个数
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static <T> T addAccessControl2(String userID,Map<String,String> dataMap,
			String sql,String sql2,Object[] params,ResultSetHandler<T> rsh,int startPos,int count){
		IRightDAO dao=new RightDAO();
		try {
			List<String> roles=Util.getAdminUserRoles();
			Boolean temp=roles.contains("1");
			if(temp){
				return DBUtil.query(sql+sql2,rsh,params,startPos,count);
			}else{
				return dao.addAccessControl2(userID, dataMap, sql,sql2, params, rsh, startPos, count);
			}
			
		} catch (DBException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 查询列表加入权限控制，userID-用户id;dataMap保存的是本SQL数据ID及其对于的表名;sql查询SQL
	 * startPos开始位置；count查询个数
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static long getAccessControlCount(String userID,Map<String,String> dataMap,
			String sql,Object[] params){
		IRightDAO dao=new RightDAO();
		try {
			List<String> roles=Util.getAdminUserRoles();
			Boolean temp=roles.contains("1");
			if(temp){
				return DBUtil.getCount(sql, params);
			}else{
				return dao.getAccessControlCount(userID, dataMap, sql, params);
			}
		} catch (DBException e) {
			e.printStackTrace();
		}
		return (Long.valueOf("0")).longValue();
	}
	
	/**
	 * 特殊统计查询，查询列表加入权限控制，userID-用户id;dataMap保存的是本SQL数据ID及其对于的表名;sql查询SQL
	 * startPos开始位置；count查询个数
	 *@author: 彭定雄
	 *@param obj
	 *@return
	 */
	public static String getAccessControlCount2(String userID,Map<String,String> dataMap,
			String sql,Object[] params){
		IRightDAO dao=new RightDAO();
		try {
			List<String> roles=Util.getAdminUserRoles();
			Boolean temp=roles.contains("1");
			if(temp){
				return sql;
			}else{
				return dao.getAccessControlCount2(userID, dataMap, sql, params);
			}
		} catch (DBException e) {
			e.printStackTrace();
		}
		return sql;
	}
	
	
	public static String generateOrderNum(){
		return "m" + System.currentTimeMillis() + "o" +  new Random().nextInt(1000000);
	}
	
	public static String urlAndBaseDecode(String value){
		try {
			return new String(Base64.decode(java.net.URLDecoder.decode(value).getBytes()));
		} catch (Base64DecodingException e) {
			e.printStackTrace();
			return value;
		}
	}
	
	/**
	 * 生成 18 位的字符编号
	 * 
	 * @return String
	 */
	public static synchronized String getNewID() {
		if(stringCount >= 9999){
			stringCount = 1000;
		}
		StringBuffer sb = new StringBuffer(20);
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		sb.append(format.format(new java.util.Date()));
		sb.append(stringCount++);
		sb.append("00");
		return sb.toString();
	}
	
	public static void main(String args[]){
//		System.out.println(Util.generateNotationString(123)); ;
//		System.out.println(java.net.URLEncoder.encode(Base64.encode("glg@163.com".getBytes())));
//		System.out.println(arrayToString(new String[]{"1","2"}));
//		System.out.println(urlAndBaseDecode("Z2xnJTQwMTYzLmNvbQ=="));
		System.out.println(getNewID());
	}
}
